mutualRecords is package{
	type Person is noone
	            or some{
		            name has type string;
		            inform has type action(integer);
              };

  genA(V) is some{
	  name is "A";
	  inform(M){
		  -- logMsg(info,"$name told $M");
		  if M>0 then
		    V.inform(M-1);
		}
  }

  genB(V) is some{
	  name is "B";
	  inform(M){
		  -- logMsg(info,"$name told $M");
		  if M>0 then
		    V.inform(M-1);
		}
  }

  genC(V) is some{
	  name is "C";
	  inform(M){
		  -- logMsg(info,"$name told $M");
		  if M>0 then
		    V().inform(M-1);
		}
  }

  setup() is let{
	  A is genA(B);
	  Af() is A;
	  B is genB(C);
	  C is genC(Af);
	} in A;
	
	main() do {
		A is setup();
		A.inform(1000);
	}
}